﻿#!/usr/bin/env python3
# -*- coding: utf-8 -*-


#高级特性

# 1).切片

list1 = list(range(100));

#切片操作,就是截取数组,截取字符串
list1[0:3] #表示截取下标0到2的,所以list[n:m]表示截取下标从n到m-1的元素长度并且返回一个新的list

print(list1[3:10]); #截取数组,返回新数组,不改变原数组


nameList = ["kongfu","zhou","hui","john","lily","lucy"];

#从最后一个开始切片,最后一个是-1

print('切片1=',nameList[-4:-1]); #list[-n:-m] 那么得到一个-n到-m-1的列表

print(nameList[-4:1]);#这里会输出空,因为负数切片是从最后一个开始算的 那么对于切片来说不存在正数的下标


# 2).迭代

d1 = {"age":20,"name":"kfz"};

#只迭代键 
for k in d1:
	print('只迭代键 d1=',k,d1[k]);

#只迭代值
for v in d1.values():
	print("只迭代值 v=",v);

#迭代键和值
for k,v in d1.items():
	print("迭代键和值 k,v=",k,v);

#字符串也是可以迭代的

str1 = "kongfuzhou";
for i in str1:
	print(i);

#判断是否是迭代对象
from collections import Iterable
 
#判断是否是迭代对象
isIter = isinstance(str1,Iterable)
print("isIter=",isIter);

#enumerate函数可以把list转换成所有元素对,记住是元素对
print("----------- #enumerate函数可以把list转换成所以元素对,记住是元素对 ----")
for k,v in enumerate(["a","b",125]):
	print(k,v);

#再看看元素对
for k in enumerate(["a","b",125]):
	print(k,isinstance(k,Iterable));# k是一个元素对,包含了下标和值,可以再次迭代
	for k1 in k:
		print("k1=",k1);

		
# 3).列表生成式

myList1 = [x * x for x in range(0,5)]; #好屌的列表生成式
print(myList1)

#嵌套循坏生成列表
myList2 = [m + n for m in "ABC" for n in "XYZ"];
print(myList2)


# 4).生成器

# --- 在Python中，这种一边循环一边计算的机制，称为生成器：generator。

#创建列表
L1 = [x for x in range(0,10)]
print(L1)

#创建生成器,最简单的方法
G1 = ( x for x in range(0,10)); #区别于列表用的是()创建generator
print(G1)	

G10 = next(G1); #通过next函数访问生成器的元素,直到没有了会抛出错误,所以一般不会用next来获取
next(G1);
for k in G1:
	print("k=",k);#这里打印的是从2开始，因为调用了两次next函数
	
#用函数定义生成器:如果一个函数定义中包含yield 关键字，那么这个函数就不再是一个普通函数，而是一个generator

def fib(max):
	a,b,n = 0,1,0
	while n<max:
		yield b; #包含yield关键字,所以这个是生成器; 遇到yield中断
		a,b = b,a+b;#下次从这里开始执行
		n = n+1;
	return "done"

fg = fib(10);
for v in fg:
	print(v);
	
	
'''
函数是顺序执行，遇到return 语句或者最后一行函数语句就
返回。而变成generator的函数，在每次调用next() 的时候执行，遇到yield 语句返回，再次执行时从上次返回
的yield 语句处继续执行。
'''

# 5).迭代器
from collections import Iterator

itor=isinstance((x for x in range(10)),Iterator)
print("迭代器",itor)

#把list、dict、str等Iterable变成Iterator可以使用iter()函数

list = []

it = iter(list)

print(isinstance(it,Iterator))
